package com.haoge7777.weblog.common.exception;

import com.haoge7777.weblog.common.enums.ResponseCodeEnum;
import com.haoge7777.weblog.common.utils.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.Optional;


@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    //捕获自定义业务异常
    @ExceptionHandler({BizException.class})
    @ResponseBody
    public Response<Object> handleBizException(HttpServletRequest request, BizException e){
        log.warn("{} request fail,errorCode: {}, errorMessage: {}",request.getRequestURI(),e.getErrorCode(),e.getErrorMessage());
        return Response.fail(e);
    }

    //捕获全局异常
    @ExceptionHandler({Exception.class})
    @ResponseBody
    public Response<Object> handleOtherException(HttpServletRequest request,Exception e){
        log.error("{} request error,",request.getRequestURI(),e);
        return Response.fail(ResponseCodeEnum.SYSTEM_ERROR);
    }

    /**
     * 捕获参数校验异常
     */
    @ExceptionHandler({MethodArgumentNotValidException.class})
    @ResponseBody
    public Response<Object> handleMethodArgumentNotValidException(HttpServletRequest request, MethodArgumentNotValidException e){
        //参数错误异常码
        String errorCode = ResponseCodeEnum.PARAM_NOT_VAILD.getErrorCode();

        //获取BindingResult
        BindingResult bindingResult = e.getBindingResult();

        StringBuilder sb = new StringBuilder();

        //获取校验不通过的字段，并组合错误信息
        Optional.ofNullable(bindingResult.getFieldErrors()).ifPresent(errors ->{
            errors.forEach(error ->
                    sb.append(error.getField())
                            .append(error.getDefaultMessage())
                            .append("，当前值：‘")
                            .append(error.getRejectedValue())
                            .append("’；")
            );
        });

        //错误信息
        String errorMessage = sb.toString();

        log.warn("{} request error ，errorCode:{}，errorMessage:{}",request.getRequestURI(),errorCode,errorMessage);

        return Response.fail(errorCode,errorMessage);

    }


}
